# Практика и проекты

## Возможные варианты организации работ:

- Контрибьюшен в любой open-source проект или библиотеку.
- Контрибьюшен в [Metarhia](https://github.com/metarhia).
- Проект студенческой группы или общественный проект в открытом коде.
- Собственный open-source проект.

## Что разрешено и что запрещено:

- Можно использовать любой язык и все встроенные в него библиотек.
- Нельзя использовать сторонние библиотеки, устанавливаемые из npm, GitHub и т.д.
- Репозиторий обязательно размещается на https://github.com в открытом доступе.
- Нужно развить навыки групповой работы, для этого студенты объединяются в группы
по 2-5 человек; группа может писать один общий проект или сделать перекрестный
ревью кода индивидуальных проектов каждого участника группы. Пересмотрите:
  - [Что такое ревью кода](https://youtu.be/EKL6NiIQ6ZU)
  - [Семинар: по ревью кода](https://youtu.be/AgH4OAKbmkM)
- Проект не может быть одномоментно залит на гитхаб за день до сдачи, его нужно
вести в гитхабе на протяжении нескольких месяцев, чтобы была видна работа,
история коммитов и PR (pull request). Хорошо, если можно будет проследить
улучшение кодовой базы, рефакторинг и оптимизацию. Пересмотрите:
  - Общие [антипаттерны для всех парадигм](https://youtu.be/NMUsUiFokr4), и
  - Антипаттерны [процедурного программирования](https://youtu.be/cTv7V22mkwE);
  - Лекция про [рефакторинг](https://youtu.be/z73wmpdweQ4).
- Хорошее ведение репозитория: issues, pull requests, milestones (см. кнопки на
закладках issues и pr в github), discussions (не обязательно), kanban (средство
планирования проекта, ищите на закладке project в github), wiki (не обязательно).
- В каждом проекте должны быть юниттесты для проверки работоспособности.
- Репозиторий должен включать:
  - Лицензию и список контрибьютеров
  - Файл `README.md` с кратким (1-2 страницы) описанием проекта. Никакие папки
  с бумагами не нужны, все только в электронном виде без бюрократии.
  - Настроенный линтер (а если кода на JavaScript, еще и prettier). Пример проекта
  с конфигурацией тут: https://github.com/HowProgrammingWorks/NodejsStarterKit
  - Файл `package.json` в котором в разделе `scripts` есть команда `lint`
  - Файлы `.eslintrc.json`, `.eslintignore` и `.prettierrc`
  - Перед каждым коммитом запускайте из командной строки: `npm run lint`
  (часть проблем автоматически исправляется, остальные - правим руками).
  - Дотфайлы для системы контроля версий и менеджера пакетов.

## Примеры тем:

- Библиотека для работы с IPv4 и IPv6 адресами: парсер, сравнение, манипуляции,
работа с масками и диапазонами, сериализаци в виде строки и числа, любые другие
операции, которые вы придумаете.
- Парсер HTML, CSS, JSON, YAML или любого другого формата файлов.
- Разработать универсальный класс для кэширования: вычислений, операций
ввода/вывода, запросов к базе данных или других операций, требующих ускорения при
помощи кешировани (на выбор). Содержащий конфигурируемый кеш с такими
характеристиками: определенный размер в количестве записей или объеме памяти,
время вытеснения из кеша, приоритеты вытеснения.
- Реализовать машинную проверку правильности синтаксиса и стиля кода. Отдельная
тема может быть по исправлению простейших синтаксических ошибок. И еще одна тема
по автоформатированию кода, приведению его к соглашениям по стилю.
- Усовершенствованный EventEmitter, например, с такими возможностями: одноразовая
и N-разовая подписка, автоматическая отписка после таймаута или отправки
специального события, ожидание событий на синтаксисе async/await и др.
- Проекция структур данных в памяти. Можно сделать специальный синтаксис (язык
проекции), что уже сделано на JavaScript в репозитории
https://github.com/HowProgrammingWorks/Projection
- Разработать простую Key-value (ключ-значение) in-memory СУБД (систему
управления базами данных, которая хранит все в оперативной памяти). В самом
простом случае это хеш-таблица. Пример реализации Redis, Memcached или MongoDB,
можно взять их интерфейсы за основу и модифицировать.
- Разработать планировщик задач в виде класса или прототипа, который умеет
повторять выполнение метода по расписанию, например: по пятницам в 2 ночи или
каждый второй понедельник месяца в 12:30 по UTC. Он создает необходимые для этого
таймеры и исполняет задачи.
- Утилиты для интерфейса командной строки.

## Регистрация тем

- Нужно заполнить форму: https://forms.gle/u7v7nUFxamcgJ2aQ6
- И дать мне права на репозиторий, мой аккаунт: https://github.com/tshemsedinov
